/**
 * 认证中间件
 * @module middlewares/auth
 */

const jwtUtils = require('../utils/jwt.utils');
const User = require('../models/user.model');

/**
 * 验证JWT令牌，确保请求来自已认证用户
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 * @param {Function} next - Express下一个中间件函数
 */
exports.authenticate = async (req, res, next) => {
  try {
    // 从请求头中获取Authorization
    const authHeader = req.headers.authorization;
    
    // 检查是否存在Authorization头
    if (!authHeader || !authHeader.startsWith('Bearer ')) {
      return res.status(401).json({
        code: 401,
        message: '未授权，请登录',
        errors: []
      });
    }
    
    // 提取令牌
    const token = authHeader.split(' ')[1];
    
    // 验证令牌
    const decoded = jwtUtils.verifyAccessToken(token);
    
    if (!decoded) {
      return res.status(401).json({
        code: 401,
        message: '令牌无效或已过期',
        errors: []
      });
    }
    
    // 查找用户
    const user = await User.findById(decoded.id);
    
    if (!user) {
      return res.status(401).json({
        code: 401,
        message: '用户不存在',
        errors: []
      });
    }
    
    // 将用户信息添加到请求对象
    req.user = user;
    
    // 继续处理请求
    next();
  } catch (error) {
    // 令牌验证失败
    return res.status(401).json({
      code: 401,
      message: '认证失败',
      errors: [{ message: error.message }]
    });
  }
};

/**
 * 验证用户是否为专业版会员
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 * @param {Function} next - Express下一个中间件函数
 */
exports.requirePro = (req, res, next) => {
  // 验证用户是否已通过认证
  if (!req.user) {
    return res.status(401).json({
      code: 401,
      message: '未授权，请登录',
      errors: []
    });
  }
  
  // 验证用户是否为专业版
  if (!req.user.isPro) {
    return res.status(403).json({
      code: 403,
      message: '权限不足，请升级到专业版访问此功能',
      errors: []
    });
  }
  
  // 如果专业版已过期
  if (req.user.proExpiryDate) {
    const expiryDate = new Date(req.user.proExpiryDate);
    const now = new Date();
    
    if (expiryDate < now) {
      return res.status(403).json({
        code: 403,
        message: '您的专业版会员已过期，请续费',
        errors: []
      });
    }
  }
  
  // 用户是有效的专业版会员，继续处理请求
  next();
};

/**
 * 验证用户是否为管理员
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 * @param {Function} next - Express下一个中间件函数
 */
exports.requireAdmin = (req, res, next) => {
  // 验证用户是否已通过认证
  if (!req.user) {
    return res.status(401).json({
      code: 401,
      message: '未授权，请登录',
      errors: []
    });
  }
  
  // 验证用户是否为管理员
  if (!req.user.isAdmin) {
    return res.status(403).json({
      code: 403,
      message: '权限不足，需要管理员权限',
      errors: []
    });
  }
  
  // 用户是管理员，继续处理请求
  next();
}; 